#include "utils/Log.h"

#include <stdio.h>

#include "jni.h"

#ifdef LOG_TAG
#undef LOG_TAG
#endif
#define LOG_TAG "security-jni"

static jstring getAppId(JNIEnv *env, jclass cls);
static jstring getAppSecret(JNIEnv *env, jclass cls);

// 绑定的java类
static const char *classPathName = "com/netease/financial/common/security/SecurityJNI";

// 登陆NFS服务器所需的app id
static const char *appId = "079b8de8-0894-411b-aa48-853bb48f069d";

// 登陆NFS服务器所需的app secret
static const char *appSecret = "1vreU6oapmduiMD75wWH";

// java方法和本地函数的映射表
static JNINativeMethod methods[] = {
        {"nativeGetAppId",     "()Ljava/lang/String;", (void *) getAppId},
        {"nativeGetAppSecret", "()Ljava/lang/String;", (void *) getAppSecret},
};

/*
 * Register several native methods for one class.
 */
static int registerNativeMethods(JNIEnv *env, const char *className,
                                 JNINativeMethod *gMethods, int numMethods) {
    jclass clazz;

    clazz = env->FindClass(className);
    if (clazz == NULL) {
        ALOGE("Native registration unable to find class '%s'", className);
        return JNI_FALSE;
    }
    if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
        ALOGE("RegisterNatives failed for '%s'", className);
        return JNI_FALSE;
    }

    return JNI_TRUE;
}

/*
 * Register native methods for all classes we know about.
 *
 * returns JNI_TRUE on success.
 */
static int registerNatives(JNIEnv * env) {
    if (!registerNativeMethods(env, classPathName,
                               methods, sizeof(methods) / sizeof(methods[0]))) {
        return JNI_FALSE;
    }

    return JNI_TRUE;
}


// ----------------------------------------------------------------------------

/*
 * This is called by the VM when the shared library is first loaded.
 */

typedef union {
    JNIEnv *env;
    void *venv;
} UnionJNIEnvToVoid;

jint JNI_OnLoad(JavaVM *vm, void *reserved) {
    UnionJNIEnvToVoid uenv;
    uenv.venv = NULL;
    jint result = -1;
    JNIEnv *env = NULL;

    ALOGI("JNI_OnLoad");

    if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {
        ALOGE("ERROR: GetEnv failed");
        goto bail;
    }
    env = uenv.env;

    if (registerNatives(env) != JNI_TRUE) {
        ALOGE("ERROR: registerNatives failed");
        goto bail;
    }

    result = JNI_VERSION_1_4;

    bail:
    return result;
}

static jstring
getAppId(JNIEnv *env, jclass cls) {
    return env->NewStringUTF(appId);
}

static jstring
getAppSecret(JNIEnv *env, jclass cls) {
    return env->NewStringUTF(appSecret);
}